{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\python35\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n",
      "d:\\python35\\lib\\site-packages\\mxnet\\optimizer.py:136: UserWarning: WARNING: New optimizer mxnet.optimizer.NAG is overriding existing optimizer mxnet.optimizer.NAG\n",
      "  Optimizer.opt_registry[name].__name__))\n"
     ]
    }
   ],
   "source": [
    "from mxnet import nd\n",
    "from mxnet import gluon\n",
    "from mxnet import image\n",
    "import matplotlib.pyplot as plt\n",
    "% matplotlib inline\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_2 (InputLayer)         (None, 224, 224, 3)       0         \n",
      "_________________________________________________________________\n",
      "block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      \n",
      "_________________________________________________________________\n",
      "block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     \n",
      "_________________________________________________________________\n",
      "block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         \n",
      "_________________________________________________________________\n",
      "block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     \n",
      "_________________________________________________________________\n",
      "block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    \n",
      "_________________________________________________________________\n",
      "block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         \n",
      "_________________________________________________________________\n",
      "block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    \n",
      "_________________________________________________________________\n",
      "block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    \n",
      "_________________________________________________________________\n",
      "block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    \n",
      "_________________________________________________________________\n",
      "block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         \n",
      "_________________________________________________________________\n",
      "block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   \n",
      "_________________________________________________________________\n",
      "block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   \n",
      "_________________________________________________________________\n",
      "block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   \n",
      "_________________________________________________________________\n",
      "block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         \n",
      "_________________________________________________________________\n",
      "block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   \n",
      "_________________________________________________________________\n",
      "block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   \n",
      "_________________________________________________________________\n",
      "block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   \n",
      "_________________________________________________________________\n",
      "block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 25088)             0         \n",
      "_________________________________________________________________\n",
      "fc1 (Dense)                  (None, 4096)              102764544 \n",
      "_________________________________________________________________\n",
      "fc2 (Dense)                  (None, 4096)              16781312  \n",
      "_________________________________________________________________\n",
      "predictions (Dense)          (None, 1000)              4097000   \n",
      "=================================================================\n",
      "Total params: 138,357,544\n",
      "Trainable params: 138,357,544\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "['dot.exe', '-Tps', 'C:\\\\Users\\\\Sherwin\\\\AppData\\\\Local\\\\Temp\\\\tmpbvo5xo0a'] return code: 1\n",
      "\n",
      "stdout, stderr:\n",
      " b''\n",
      "b\"'dot.exe' \\xb2\\xbb\\xca\\xc7\\xc4\\xda\\xb2\\xbf\\xbb\\xf2\\xcd\\xe2\\xb2\\xbf\\xc3\\xfc\\xc1\\xee\\xa3\\xac\\xd2\\xb2\\xb2\\xbb\\xca\\xc7\\xbf\\xc9\\xd4\\xcb\\xd0\\xd0\\xb5\\xc4\\xb3\\xcc\\xd0\\xf2\\r\\n\\xbb\\xf2\\xc5\\xfa\\xb4\\xa6\\xc0\\xed\\xce\\xc4\\xbc\\xfe\\xa1\\xa3\\r\\n\"\n",
      "\n"
     ]
    },
    {
     "ename": "ImportError",
     "evalue": "Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAssertionError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32md:\\python35\\lib\\site-packages\\keras\\utils\\vis_utils.py\u001b[0m in \u001b[0;36m_check_pydot\u001b[1;34m()\u001b[0m\n\u001b[0;32m     26\u001b[0m         \u001b[1;31m# to check the pydot/graphviz installation.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 27\u001b[1;33m         \u001b[0mpydot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcreate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpydot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     28\u001b[0m     \u001b[1;32mexcept\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\python35\\lib\\site-packages\\pydot.py\u001b[0m in \u001b[0;36mcreate\u001b[1;34m(self, prog, format, encoding)\u001b[0m\n\u001b[0;32m   1883\u001b[0m                      err=stderr_data))\n\u001b[1;32m-> 1884\u001b[1;33m         \u001b[1;32massert\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreturncode\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreturncode\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1885\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0mstdout_data\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mAssertionError\u001b[0m: 1",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-3-68d125f20228>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mmodel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mVGG16\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mweights\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msummary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0mplot_model\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'model.png'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32md:\\python35\\lib\\site-packages\\keras\\utils\\vis_utils.py\u001b[0m in \u001b[0;36mplot_model\u001b[1;34m(model, to_file, show_shapes, show_layer_names, rankdir)\u001b[0m\n\u001b[0;32m    133\u001b[0m             \u001b[1;34m'LR'\u001b[0m \u001b[0mcreates\u001b[0m \u001b[0ma\u001b[0m \u001b[0mhorizontal\u001b[0m \u001b[0mplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    134\u001b[0m     \"\"\"\n\u001b[1;32m--> 135\u001b[1;33m     \u001b[0mdot\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmodel_to_dot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshow_shapes\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshow_layer_names\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrankdir\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    136\u001b[0m     \u001b[0m_\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mextension\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msplitext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mto_file\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    137\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mextension\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\python35\\lib\\site-packages\\keras\\utils\\vis_utils.py\u001b[0m in \u001b[0;36mmodel_to_dot\u001b[1;34m(model, show_shapes, show_layer_names, rankdir)\u001b[0m\n\u001b[0;32m     54\u001b[0m     \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodels\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mSequential\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     55\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 56\u001b[1;33m     \u001b[0m_check_pydot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     57\u001b[0m     \u001b[0mdot\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpydot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     58\u001b[0m     \u001b[0mdot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'rankdir'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrankdir\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\python35\\lib\\site-packages\\keras\\utils\\vis_utils.py\u001b[0m in \u001b[0;36m_check_pydot\u001b[1;34m()\u001b[0m\n\u001b[0;32m     29\u001b[0m         \u001b[1;31m# pydot raises a generic Exception here,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     30\u001b[0m         \u001b[1;31m# so no specific class can be caught.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 31\u001b[1;33m         raise ImportError('Failed to import pydot. You must install pydot'\n\u001b[0m\u001b[0;32m     32\u001b[0m                           ' and graphviz for `pydotprint` to work.')\n\u001b[0;32m     33\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mImportError\u001b[0m: Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work."
     ],
     "output_type": "error"
    }
   ],
   "source": [
    "from keras.utils import plot_model\n",
    "from keras.applications.vgg16 import VGG16\n",
    "model = VGG16(weights=None)\n",
    "model.summary()\n",
    "plot_model(model,'model.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function CreateAugmenter in module mxnet.image.image:\n",
      "\n",
      "CreateAugmenter(data_shape, resize=0, rand_crop=False, rand_resize=False, rand_mirror=False, mean=None, std=None, brightness=0, contrast=0, saturation=0, hue=0, pca_noise=0, rand_gray=0, inter_method=2)\n",
      "    Creates an augmenter list.\n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    data_shape : tuple of int\n",
      "        Shape for output data\n",
      "    resize : int\n",
      "        Resize shorter edge if larger than 0 at the begining\n",
      "    rand_crop : bool\n",
      "        Whether to enable random cropping other than center crop\n",
      "    rand_resize : bool\n",
      "        Whether to enable random sized cropping, require rand_crop to be enabled\n",
      "    rand_gray : float\n",
      "        [0, 1], probability to convert to grayscale for all channels, the number\n",
      "        of channels will not be reduced to 1\n",
      "    rand_mirror : bool\n",
      "        Whether to apply horizontal flip to image with probability 0.5\n",
      "    mean : np.ndarray or None\n",
      "        Mean pixel values for [r, g, b]\n",
      "    std : np.ndarray or None\n",
      "        Standard deviations for [r, g, b]\n",
      "    brightness : float\n",
      "        Brightness jittering range (percent)\n",
      "    contrast : float\n",
      "        Contrast jittering range (percent)\n",
      "    saturation : float\n",
      "        Saturation jittering range (percent)\n",
      "    hue : float\n",
      "        Hue jittering range (percent)\n",
      "    pca_noise : float\n",
      "        Pca noise level (percent)\n",
      "    inter_method : int, default=2(Area-based)\n",
      "        Interpolation method for all resizing operations\n",
      "    \n",
      "        Possible values:\n",
      "        0: Nearest Neighbors Interpolation.\n",
      "        1: Bilinear interpolation.\n",
      "        2: Area-based (resampling using pixel area relation). It may be a\n",
      "        preferred method for image decimation, as it gives moire-free\n",
      "        results. But when the image is zoomed, it is similar to the Nearest\n",
      "        Neighbors method. (used by default).\n",
      "        3: Bicubic interpolation over 4x4 pixel neighborhood.\n",
      "        4: Lanczos interpolation over 8x8 pixel neighborhood.\n",
      "        9: Cubic for enlarge, area for shrink, bilinear for others\n",
      "        10: Random select from interpolation method metioned above.\n",
      "        Note:\n",
      "        When shrinking an image, it will generally look best with AREA-based\n",
      "        interpolation, whereas, when enlarging an image, it will generally look best\n",
      "        with Bicubic (slow) or Bilinear (faster but still looks OK).\n",
      "    \n",
      "    Examples\n",
      "    --------\n",
      "    >>> # An example of creating multiple augmenters\n",
      "    >>> augs = mx.image.CreateAugmenter(data_shape=(3, 300, 300), rand_mirror=True,\n",
      "    ...    mean=True, brightness=0.125, contrast=0.125, rand_gray=0.05,\n",
      "    ...    saturation=0.125, pca_noise=0.05, inter_method=10)\n",
      "    >>> # dump the details\n",
      "    >>> for aug in augs:\n",
      "    ...    aug.dumps()\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(image.CreateAugmenter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def image_augmentaion(image_data, n =4):\n",
    "    # An example of creating multiple augmenters\n",
    "    image_data = image_data.astype('float32')\n",
    "    \n",
    "#     augs = image.CreateAugmenter(data_shape=image_data.shape, rand_mirror=True)\n",
    "\n",
    "    augs = [\n",
    "#         image.ResizeAug(250), # 将短边resize至250\n",
    "        image.HorizontalFlipAug(.5), # 0.5概率的水平翻转变换\n",
    "#         image.HueJitterAug(.6), # -0.6~0.6的随机色调\n",
    "        image.BrightnessJitterAug(.25), # -0.5~0.5的随机亮度\n",
    "#         image.RandomCropAug([230,230]) # 随机裁剪成（230,230）\n",
    "#         image.ContrastJitterAug(.25), #调整对比度\n",
    "#         image.RandomSizedCropAug((200,200), .1, (.5,2)) #随机裁剪，要求保留至少0.1的区域，随机长宽比在.5和2之间\n",
    "    ]\n",
    "    # dump the details\n",
    "    print(augs,len(augs),'\\n end')\n",
    "    img = [aug(image_data) for aug in augs]    \n",
    "\n",
    "    img_aug = nd.stack(*img).clip(0,255)/255\n",
    "    return img_aug"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def apply(img, aug, n=2):\n",
    "    # 转成float，一是因为aug需要float类型数据来方便做变化。\n",
    "    # 二是这里会有一次copy操作，因为有些aug直接通过改写输入\n",
    "    #（而不是新建输出）获取性能的提升\n",
    "    X = [aug(img.astype('float32')) for _ in range(n*n)]\n",
    "    # 有些aug不保证输入是合法值，所以做一次clip\n",
    "    # 显示浮点图片时imshow要求输入在[0,1]之间\n",
    "    Y = nd.stack(*X).clip(0,255)/255\n",
    "    return Y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def apply_aug_list(img, augs):\n",
    "    for f in augs:\n",
    "        img = f(img)\n",
    "    return img\n",
    "\n",
    "def transform(data, augs):\n",
    "    # data: sample x height x width x channel\n",
    "    # label: sample\n",
    "    data = data.astype('float32')\n",
    "    if augs is not None:\n",
    "        # apply to each sample one-by-one and then stack\n",
    "        data = nd.stack(*[apply_aug_list(d, augs) for d in data])\n",
    "#         data = nd.transpose(data, (0,3,1,2))\n",
    "    return data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "[[[255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  ...\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]]\n",
      "\n",
      " [[255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  ...\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]]\n",
      "\n",
      " [[255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  ...\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]]\n",
      "\n",
      " ...\n",
      "\n",
      " [[255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  ...\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]]\n",
      "\n",
      " [[255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  ...\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]]\n",
      "\n",
      " [[255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  ...\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]\n",
      "  [255. 255. 255.]]]\n",
      "<NDArray 490x640x3 @cpu(0)>\n"
     ]
    }
   ],
   "source": [
    "img = image.imread('params.png')\n",
    "img = image.imresize(img,640,490)\n",
    "import numpy as np\n",
    "img_data = []\n",
    "for _ in range(4):\n",
    "    img_data.append(img.asnumpy())\n",
    "\n",
    "img_data = nd.array(img_data)\n",
    "# print(img_data[1])\n",
    "augs = [\n",
    "#         image.ResizeAug(250), # 将短边resize至250\n",
    "        image.HorizontalFlipAug(.5), # 0.5概率的水平翻转变换\n",
    "#         image.HueJitterAug(.6), # -0.6~0.6的随机色调\n",
    "        image.BrightnessJitterAug(.25), # -0.5~0.5的随机亮度\n",
    "#         image.RandomCropAug([230,230]) # 随机裁剪成（230,230）\n",
    "#         image.ContrastJitterAug(.25), #调整对比度\n",
    "#         image.RandomSizedCropAug((200,200), .1, (.5,2)) #随机裁剪，要求保留至少0.1的区域，随机长宽比在.5和2之间\n",
    "    ]\n",
    "# img_aug = transform(img_data, augs)\n",
    "# # img_aug = image_augmentaion(img,4)\n",
    "# print('\\n --------------\\n', len(img_aug))\n",
    "# _ , figs = plt.subplots(1,4,figsize = (8,8))\n",
    "# for i in range(len(img_aug)): \n",
    "#     figs[i].imshow(img_aug[i].asnumpy())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
